//+------------------------------------------------------------------+
//|                                                 PositionInfo.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Object.h>

//+------------------------------------------------------------------+
//| 持仓信息类                                                       |
//| 用途：访问持仓信息的类                                           |
//|         继承自 CObject 类                                        |
//+------------------------------------------------------------------+
class CPositionInfo : public CObject
{
protected:
   ENUM_POSITION_TYPE m_type;        // 持仓类型
   double            m_volume;        // 持仓量
   double            m_price;          // 开仓价格
   double            m_stop_loss;      // 止损价格
   double            m_take_profit;    // 止盈价格

public:
   /** 构造函数 */
   CPositionInfo(void);
   
   /** 析构函数 */
   ~CPositionInfo(void);
   
   /**
    * 获取持仓ticket
    * @return 持仓ticket
    */
   ulong             Ticket(void) const;
   
   /**
    * 获取持仓开仓时间
    * @return 开仓时间
    */
   datetime          Time(void) const;
   
   /**
    * 获取持仓开仓时间（毫秒）
    * @return 开仓时间（毫秒）
    */
   ulong             TimeMsc(void) const;
   
   /**
    * 获取持仓最后更新时间
    * @return 最后更新时间
    */
   datetime          TimeUpdate(void) const;
   
   /**
    * 获取持仓最后更新时间（毫秒）
    * @return 最后更新时间（毫秒）
    */
   ulong             TimeUpdateMsc(void) const;
   
   /**
    * 获取持仓类型
    * @return 持仓类型枚举值
    */
   ENUM_POSITION_TYPE PositionType(void) const;
   
   /**
    * 获取持仓类型描述
    * @return 持仓类型描述字符串
    */
   string            TypeDescription(void) const;
   
   /**
    * 获取持仓魔术码
    * @return 魔术码
    */
   long              Magic(void) const;
   
   /**
    * 获取持仓标识符
    * @return 持仓标识符
    */
   long              Identifier(void) const;
   
   /**
    * 获取持仓量
    * @return 持仓量
    */
   double            Volume(void) const;
   
   /**
    * 获取开仓价格
    * @return 开仓价格
    */
   double            PriceOpen(void) const;
   
   /**
    * 获取止损价格
    * @return 止损价格
    */
   double            StopLoss(void) const;
   
   /**
    * 获取止盈价格
    * @return 止盈价格
    */
   double            TakeProfit(void) const;
   
   /**
    * 获取当前价格
    * @return 当前价格
    */
   double            PriceCurrent(void) const;
   
   /**
    * 获取持仓佣金
    * @return 佣金
    */
   double            Commission(void) const;
   
   /**
    * 获取持仓隔夜利息
    * @return 隔夜利息
    */
   double            Swap(void) const;
   
   /**
    * 获取持仓利润
    * @return 利润
    */
   double            Profit(void) const;
   
   /**
    * 获取持仓交易品种
    * @return 交易品种
    */
   string            Symbol(void) const;
   
   /**
    * 获取持仓注释
    * @return 持仓注释
    */
   string            Comment(void) const;
   
   /**
    * 获取整数型持仓信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoInteger(const ENUM_POSITION_PROPERTY_INTEGER prop_id, long &var) const;
   
   /**
    * 获取浮点型持仓信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoDouble(const ENUM_POSITION_PROPERTY_DOUBLE prop_id, double &var) const;
   
   /**
    * 获取字符串型持仓信息
    * @param prop_id 属性ID
    * @param var 输出值
    * @return 成功返回 true，失败返回 false
    */
   bool              InfoString(const ENUM_POSITION_PROPERTY_STRING prop_id, string &var) const;
   
   /**
    * 格式化持仓类型
    * @param str 输出字符串
    * @param type 持仓类型
    * @return 格式化后的字符串
    */
   string            FormatType(string &str, const uint type) const;
   
   /**
    * 格式化持仓信息
    * @param str 输出字符串
    * @return 格式化后的持仓信息
    */
   string            FormatPosition(string &str) const;
   
   /**
    * 通过交易品种选择持仓
    * @param symbol 交易品种
    * @return 成功返回 true，失败返回 false
    */
   bool              Select(const string symbol);
   
   /**
    * 通过魔术码选择持仓
    * @param symbol 交易品种
    * @param magic 魔术码
    * @return 成功返回 true，失败返回 false
    */
   bool              SelectByMagic(const string symbol, const ulong magic);
   
   /**
    * 通过ticket选择持仓
    * @param ticket 持仓ticket
    * @return 成功返回 true，失败返回 false
    */
   bool              SelectByTicket(const ulong ticket);
   
   /**
    * 通过索引选择持仓
    * @param index 索引位置
    * @return 成功返回 true，失败返回 false
    */
   bool              SelectByIndex(const int index);
   
   /**
    * 存储持仓当前状态
    */
   void              StoreState(void);
   
   /**
    * 检查持仓状态是否变化
    * @return 如果状态变化返回 true，否则返回 false
    */
   bool              CheckState(void);
};
//+------------------------------------------------------------------+